home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / modules / nessus-2.2.8.mo / usr / lib / nessus / plugins / find_ap.nasl < prev    next >
Text File  |  2005-01-14  |  10KB  |  365 lines

  1. # Copyright 2002 by John Lampe...j_lampe@bellsouth.net
  2. # thanks for signatures and packet dumps from Matt N., William Craig,
  3. # Bill King, jay at kinetic dot org,  HD Moore
  4. #
  5. # Modifications by rd: don't use forge_udp_packet() but use a regular
  6. # udp socket instead ; use Nessus's SNMP functions, don't hardcode the
  7. # use of the "public" SNMP community. Use SNMP/sysDesc is present already,
  8. # simplified the search through the sysDesc string.
  9. #
  10. #
  11.  
  12. #
  13. # See the Nessus Scripts License for details
  14. #
  15. #
  16.  
  17. desc["english"] = "
  18. The remote host is a Wireless Access Point.  
  19.  
  20. You should ensure that the proper physical and logical controls exist
  21. around the AP.  A misconfigured access point may allow an attacker to
  22. gain access to an internal network without being physically present on 
  23. the premises.  If the access point is using an 'off-the-shelf' configuration
  24. (such as 40 or 104 bit WEP encryption), the data being passed through the 
  25. access point may be vulnerable to hijacking or sniffing. 
  26.  
  27. Risk factor : Low";
  28.  
  29.  
  30. if(description)
  31. {
  32.  script_id(11026);
  33.  script_version ("$Revision: 1.41 $");
  34.  
  35.  name["english"] = "Access Point detection";
  36.  script_name(english:name["english"]);
  37.  
  38.  
  39.  script_description(english:desc["english"]);
  40.  
  41.  summary["english"] = "
  42. Detects wireless access points present via TCP/IP Nmap fingerprint, 
  43. analysis of HTTP management interface, analysis of FTP banner and
  44. analysis of SNMP information present";
  45.  
  46.  script_summary(english:"Detects Wireless APs");
  47.  
  48.  script_category(ACT_GATHER_INFO);
  49.  
  50.  script_copyright(english:"This script is Copyright (C) 2002 John Lampe / Ron Gula / Stan Scalsky (Tenable Network Security)");
  51.  family["english"] = "General";
  52.  script_family(english:family["english"]);
  53.  script_dependencie("snmp_sysDesc.nasl", "http_version.nasl");
  54.  exit(0);
  55. }
  56.  
  57. #
  58. # The script code starts here
  59. #
  60.  
  61. include("http_func.inc");
  62.  
  63. # list of NMAP tcp fingerprints which indicate a WAP (broken)
  64. # current list as of nmap-3.50
  65.  
  66. tcpfinger[1] = "2Wire Home Portal 100 residential gateway";
  67. tcpfinger[2] = "Aironet AP4800E";
  68. tcpfinger[3] = "Apple Airport Extreme Base Station";
  69. tcpfinger[4] = "BenQ Wireless Lan Router";
  70. tcpfinger[5] = "Cisco 360 Access Point";
  71. tcpfinger[6] = "Cisco 1200 access point";
  72. tcpfinger[7] = "Cisco Aironet WAP";
  73. tcpfinger[8] = "Cisco AP1220";
  74. tcpfinger[9] = "Datavoice 3Com WAP";
  75. tcpfinger[10] = "D-Link 704P Broadband Gateway or DI-713P WAP";
  76. tcpfinger[11] = "D-Link DI-713P Wireless Gateway";
  77. tcpfinger[12] = "D-Link DI-series, Sitecom BHS WAP";
  78. tcpfinger[13] = "D-Link DRC-1000AP or 3com Access Point 2000";
  79. tcpfinger[14] = "D-Link DWL-5000AP";
  80. tcpfinger[15] = "D-Link, SMC, Tonze, or US Robotics wireless broadband router";
  81. tcpfinger[16] = "Fiberline WL-1200R1";
  82. tcpfinger[17] = "Linksys WET-11";
  83. tcpfinger[18] = "Linksys BEFW11S4 WAP or BEFSR41 router";
  84. tcpfinger[19] = "Linksys WAP11 Wireless AP";
  85. tcpfinger[20] = "Linksys WAP11 or D-Link DWL-900+";
  86. tcpfinger[21] = "Linksys, D-Link, or Planet WAP";
  87. tcpfinger[22] = "Netgear DG824M WAP";
  88. tcpfinger[23] = "Netgear FM144P";
  89. tcpfinger[24] = "Netgear MR314";
  90. tcpfinger[25] = "Netgear MR814";
  91. tcpfinger[26] = "Panasonic network camera or SMC WAP";
  92. tcpfinger[27] = "Planet WAP 1950 Wireless Access Point";
  93. tcpfinger[28] = "SMC Barricade or D-Link DL-707 Wireless Broadband Router";
  94. tcpfinger[29] = "SMC Barricade Wireless Broadband Router";
  95. tcpfinger[30] = "SMC Barricade DSL Router/Modem/Wireless AP";
  96. tcpfinger[31] = "SMC Barricade Router";
  97. tcpfinger[32] = "Symbol/Spectrum24 wireless AP";
  98. tcpfinger[33] = "US Robotics USR8022 broadband wireless router";
  99. tcpfinger[34] = "US Robotics broadband router";
  100. tcpfinger[35] = "Zcomax Wireless Access Point";
  101. tcpfinger[36] = "ZoomAir IG-4165 wireless gateway";
  102.  
  103. # Wireless Bridges
  104. tcpfinger[37] = "Aironet 630-2400";
  105. tcpfinger[38] = "Aironet Wireless Bridge";
  106. tcpfinger[39] = "ARLAN BR2000E V5.0E Radio Bridge";
  107. tcpfinger[40] = "BreezeCOM BreezeACCESS wireless bridge";
  108. tcpfinger[41] = "Cisco AIR-WGB340";
  109. tcpfinger[42] = "Cisco WGB350";
  110. tcpfinger[43] = "Linksys WET-11 wireless ethernet bridge";
  111. tcpfinger[44] = "Linksys WGA54G";
  112. tcpfinger[45] = "Proxim Stratum MP wireless bridge";
  113.  
  114. # This one will cause lots of false positives since the full signature is:
  115. #  Embedded device: HP Switch, Copper Mountain DSL Concentrator, Compaq 
  116. #  Remote Insight Lights-Out remote console card, 3Com NBX 25 phone 
  117. #  system or Home Wireless Gateway, or TrueTime NTP clock
  118.  
  119. tcpfinger[46] = "3Com NBX 25 phone system or Home Wireless Gateway";
  120.  
  121.  
  122. pre = "The remote host is a Wireless Access Point (";
  123.  
  124. warning = string(").\n\nYou should ensure that the proper physical and logical
  125. controls exist around the AP.  A misconfigured access point may allow an
  126. attacker to gain access to an internal network without being physically
  127. present on the premises.  If the access point is using an 'off-the-shelf'
  128. configuration (such as 40 or 104 bit WEP encryption), the data being 
  129. passed through the access point may be vulnerable to hijacking
  130. or sniffing.
  131.  
  132. Risk factor : Low");
  133.  
  134. os = get_kb_item("Host/OS");
  135. if( os )
  136. {
  137.   for (i=1; tcpfinger[i]; i = i + 1) {
  138.     if (tcpfinger[i] >< os ) {
  139.         security_warning(port:0, data:pre+os+warning);
  140.         exit(0);
  141.         }
  142.     }
  143. }
  144.  
  145. # try to find APs via web management interface
  146. port = get_http_port(default:80);
  147.  
  148. sigs = make_list(
  149. # "WLAN",    # SMC, risky
  150.  "SetExpress.shm",   #cisco 350
  151.  "D-Link DI-1750",
  152.  "D-Link DI-824",
  153.  "D-Link DI-784",
  154.  "D-Link DI-774",
  155.  "D-Link DI-764",
  156.  "D-Link DI-754",
  157.  "D-Link DI-714",
  158.  "D-Link DI-713",
  159.  "D-Link DI-624",
  160.  "DI-624+",
  161.  "D-Link DI-614",
  162.  "D-Link DI-524",
  163.  "D-Link DI-514",
  164.  "D-Link DSA-3100",
  165.  "Cisco AP340",
  166.  "Cisco AP350",
  167.  "Linksys WAP",
  168.  'Linksys WRT',
  169.  "Linksys BEFW",
  170.  "Linksys WPG",
  171.  "Linksys WRV",
  172.  "SOHO Version",
  173.  'realm="BUFFALO WBR-G54"',
  174.  'WWW-Authenticate: Basic realm="R2 Wireless Access Platform"',
  175.  'realm="MR814',
  176.  'realm="FM114P',
  177.  'realm="MA101',
  178.  'realm="MR314',
  179.  'realm="ME102',
  180.  'realm="DG824M',
  181.  'realm="DG834G',
  182.  'realm="PS111W',
  183.  'realm="CG814M',
  184.  'realm="FVM318',
  185.  'realm="ME103',
  186.  'realm="HE102',
  187.  'realm="HR314',
  188.  'realm="WG101',
  189.  'realm="WG302',
  190.  'realm="WG602',
  191.  'realm="WGR614',
  192.  'realm="FWAG114',
  193.  'realm="FM114P',
  194.  'realm="WKPC',
  195.  'realm="WCG',
  196.  'realm="WET',
  197.  'realm="BEFW',
  198.  'realm="WAP11',
  199.  'realm="WAP51',
  200.  'realm="WAP54',
  201.  'realm="WAP55',
  202.  'realm=WRT54',
  203.  'realm=WRT55',
  204.  "BCM430",        # Broadcom chips (?)
  205.  "OfficePortal 1800HW",
  206.  "HomePortal 180HW",
  207.  "Portal 1000HG",
  208.  "Portal 1000HW",
  209.  "Portal 1000SW",
  210.  "Portal 1700HG",
  211.  "Portal 1700HW",
  212.  "Portal 1700SG",
  213.  "HomePortal 180HG",
  214.  "HomePortal 2000",
  215.  "Wireless 11a/b/g Access Point",
  216.  "AT-WA1004G",
  217.  "AT-WA7500",
  218.  "AT-WL2411",
  219.  "RTW020",
  220.  "RTA040W",
  221.  "RTW010",
  222.  "The setup wizard will help you to configure the Wireless",
  223.  'realm="Access-Product',
  224.  "USR8054",
  225.  "WGR614",
  226.  "WGR624",
  227.  "Linksys WET11",
  228.  "wireless/wireless_tab1.jpg",
  229.  "wireless/use_as_access_point",
  230.  "Gateway 11G Router",
  231.  "Gateway 11B Router",
  232.  "MN-500",
  233.  "MN-700",
  234.  "MN-510",
  235.  "SBG900",
  236.  "SBG1000",
  237.  "WA840G",
  238.  "WL1200-AB",
  239.  "WL5400AP"
  240.  );
  241.  
  242.  
  243.  
  244. if(get_port_state(port))
  245. {
  246.  soc = http_open_socket(port);
  247.  if(soc) {
  248.   send(socket:soc, data:http_get(item:"/", port:port));
  249.   answer = http_recv(socket:soc);
  250.   http_close_socket(soc);
  251.   if (answer) {
  252.     foreach sig (sigs) {
  253.           if ((egrep(pattern:sig, string:answer))) {
  254.               security_warning(port:0, data:pre+sig+warning);
  255.               exit(0);
  256.           }
  257.     }
  258.   }
  259.  }
  260. }
  261.  
  262.  
  263. # try find APs via ftp
  264. port = 21;
  265. ftppos[0] = "Cisco BR500";
  266. ftppos[1] = "WLAN AP";
  267. ftppos[2]= "ireless";
  268.  
  269. if(get_port_state(port))
  270. {
  271. soc = open_sock_tcp(port);
  272. if (soc) {
  273.   r = recv_line(socket:soc, length:512);
  274.   close(soc);
  275.   if (r) {
  276.       for (i=0; ftppos[i]; i = i + 1) {
  277.           if ((egrep(pattern:ftppos[i], string:r))) {
  278.                security_warning(port:0, data:pre+ftppos[i]+warning);
  279.                exit(0);
  280.           }
  281.       }
  282.   }
  283.  }
  284. }
  285.  
  286. # try to find APs via snmp port (rely on them leaving public community string)
  287.  
  288.  
  289. #
  290. # Solaris comes with a badly configured snmpd which
  291. # always reply with the same value. We make sure the answers
  292. # we receive are not in the list of default values usually
  293. # answered...
  294. #
  295. function valid_snmp_value(value)
  296. {
  297.  if("/var/snmp/snmpdx.st" >< value)return(0);
  298.  if("/etc/snmp/conf" >< value)return(0);
  299.  if( (strlen(value) == 1) && (ord(value[0]) < 32) )return(0);
  300.  return(1);
  301. }
  302.  
  303. community = get_kb_item("SNMP/community");
  304. if(!community)exit(0);
  305.  
  306. if(get_udp_port_state(161))
  307. {
  308.  soc = open_sock_udp(161);
  309.  
  310. # put char string identifiers below
  311.  snmppos[0]="AP-";                     # Compaq AP
  312.  snmppos[1]="Base Station";
  313.  snmppos[2]="WaveLan";
  314.  snmppos[3]="WavePOINT-II";# Orinoco WavePOINT II Wireless AP
  315.  snmppos[4]="AP-1000";     # Orinoco AP-1000 Wireless AP
  316.  snmppos[5]="Cisco BR500"; # Cisco Aironet Wireless Bridge
  317.  snmppos[6]="ireless";
  318.  snmppos[7]="Internet Gateway Device"; # D-Link (fp-prone ?)
  319.  
  320.  
  321. # create GET sysdescr call
  322.  
  323. mydata = get_kb_item("SNMP/sysDesc");
  324. if(!mydata) {
  325.  snmpobjid = raw_string(0x2b,0x06,0x01,0x02,0x01,0x01,0x01,0x00);            
  326.  version = raw_string(0x02 , 0x01 , 0x00);
  327.  snmplen = strlen(community) % 256;
  328.  community = raw_string(0x04, snmplen) + community;
  329.  pdu_type = raw_string(0xa0, 0x19);             
  330.  request_id = raw_string(0x02,0x01,0xde);
  331.  error_stat = raw_string(0x02,0x01,0x00);
  332.  error_index = raw_string(0x02,0x01,0x00);
  333.  tie_off = raw_string(0x05,0x00);
  334.  
  335.  
  336.  snmpstring = version + community + pdu_type + request_id + error_stat
  337. + error_index + raw_string(0x30,0x0e,0x30,0x0c,0x06,0x08) + snmpobjid +
  338. tie_off;
  339.  
  340.  tot_len = strlen(snmpstring);
  341.  tot_len = tot_len % 256;
  342.  
  343.  snmpstring = raw_string(0x30, tot_len) +  snmpstring;
  344.  
  345.  send(socket:soc, data:snmpstring);
  346.  
  347.  mydata = recv(socket:soc, length:1025);
  348.  if(strlen(mydata) < 48)exit(0);
  349.  if(!mydata)exit(0);
  350.  
  351.  check_val = valid_snmp_value(value:mydata);
  352.  if (!check_val) exit(0);
  353. }
  354.  
  355.  
  356. flag = 0;
  357.  
  358. for (psi=0; snmppos[psi]; psi = psi + 1) {
  359.         if(snmppos[psi] >< mydata) {
  360.             security_warning(port:0, data:pre+snmppos[psi]+warning);
  361.             exit(0);
  362.         }
  363.  }
  364. }
  365.